clear;clc;close all;
% 观测点数
N = 500;
x = linspace(-2*pi, 2*pi,N );
% 信号
y = 3 * sin(x)+2*cos(x.^2);
% 噪声（方差1.25）
v1 = 0.05*randn(N , 1).*y';
v2 = 0.05*randn(N , 1);
v=v1+v2;
z=y'+v;
d=y';
P=x;
T=z';

%%% 画图
% plot(x,y);
% hold on;
% plot(x,T);
% axis([-2*pi 2*pi -6 6]);
% legend('y-x曲线','z-x曲线');
% xlabel('横坐标 x');
% ylabel('纵坐标 y');
% 
% figure;
% plot(x,v');
% axis([-2*pi 2*pi -0.7 0.7]);
% legend('v-x曲线');
% xlabel('横坐标 x');
% ylabel('纵坐标 y');

% 数据集设置
[a,b]=dividerand([P;T],0.8,0.2); %训练集+验证集 80%，测试集20%
trainp=a(1,:);
traint=a(2,:);
testp=b(1,:);
testt=b(2,:);

%RBF网络创建
net=newrb(trainp,traint,10e-7,0.8,50,25);

% 指定训练参数
net.trainFcn='trainlm';

%BP网络参数的设置
% net.trainParam.epochs=1000; %训练次数设置
% net.trainParam.goal=1e-7;%训练目标设置
% net.trainParam.lr=0.01;%学习率设置,应设置为较少值，太大虽然会在开始加快收敛速度，但临近最佳点时，会产生动荡，而致使无法收敛
% net.trainParam.mc=0.9;%动量因子的设置，默认为0.9
% net.trainParam.show=25;%显示的间隔次数
% net.divideParam.trainRatio=6/8; %训练集 60%
% net.divideParam.valRatio=2/8;%验证集 20%


%RBF网络创建与训练
% net_rbf=newhop(trainp,traint,1);

%RBF参数设置
% net_rbf.trainParam
% net_rbf.trainParam.epochs=10000;%训练次数设置


%训练网络
[net,tr]=train(net,trainp,traint);

% 测试结果
[output]=sim(net,testp);%训练的数据，根据BP得到的结果
test_mse = mse(output-testt);

figure;
plot(x,d);
hold on;
plot(trainp,traint);
plot(testp,output,"o");
% plot(testp,testt,"x");
title("RBF");
legend('理论输出','实际输出','预测点');
xlabel('横坐标 T/s');
ylabel('纵坐标 X/m');


